function unique(arr) {
    // 创建一个空对象，用于存储出现过的元素
    var obj = {};

    // 使用数组的filter方法来过滤数组，并返回一个新的数组，其中只包含唯一的元素
    return arr.filter(function(item, index, arr) {
        // 检查对象中是否已经有了当前元素的类型和值组合的属性

        // typeof item + item 是一个关键步骤，它将元素的类型（typeof item）和值（item）拼接成一个字符串
        // 这是因为typeof在区分对象和数组时会返回"object"，所以这种方法不能区分不同类型的对象或数组
        // 通过拼接类型和值，我们可以创建一个唯一的键来存储每个元素的唯一标识

        // 如果这个键已经存在于对象中，表示当前元素是重复的，因此返回false
        if (obj.hasOwnProperty(typeof item + item)) {
            return false;
        } else {
            // 如果这个键不存在，将其添加到对象中并设置为true
            // 同时返回true，表示当前元素是唯一的，应该包含在新数组中
            obj[typeof item + item] = true;
            return true;
        }
    })
}